/**
 * @file error.c
 * @author chushang (email:chushangcs@163.com)
 * @brief 错误指示函数,当发生错误时,可以调用Error_Set函数设置错误
 * @version 0.1
 * @date 2025-04-29
 *
 * @copyright Copyright (c) 2025
 *
 */

#include "error.h"
#include "led.h"
#include "stdlib.h"
#include "string.h"
#include "dwt.h"

Error error;
static LED *led; // 用于指示错误发生的LED灯

/**
 * @brief 设置错误
 *
 * @param func [in] 错误发生时所在的函数
 * @param line [in] 错误发生时所在的行数
 * @param file [in] 错误发生时所在的文件
 */
void Error_Set(const char *func, uint16_t line, const char *file)
{
    strcpy(error.func_name, func);
    strcpy(error.file_name, file);
    error.line = line;

    while (1)
    {
        LED_Twinkle(led, 500);
    }
}

/**
 * @brief 初始化,主要是初始化错误指示灯
 *
 */
void Error_Init(void)
{
    memset(&error, 0, sizeof(Error));
    error.func_name = (char *)malloc(20);
    error.file_name = (char *)malloc(20);
    LEDConfig lc = {
        .gpio_pin = GPIO_PIN_11,
        .gpio_port = GPIOA,
    };

    led = LED_Register(&lc);
}